#ifndef FILETRANSFERHELPER_H
#define FILETRANSFERHELPER_H

#include <QObject>
#include <QWebSocket>
#include <QFileInfo>
#include <QDir>
#include <QDataStream>
#include <QUuid>

/* 一个FiletransferHelper表示一个连接
 * */
class FiletransferHelper : public QObject
{
    Q_OBJECT
public:
    explicit FiletransferHelper(QObject *parent = nullptr);
    ~FiletransferHelper();

    QVariant data;                                                                              //用户数据
    QString transferToken;                                                                      //传输任务Token
    QString currentFileToken;                                                                   //传输文件Token(GUID)
    QString localFileName;                                                                      //文件下载时的本地目标文件名/文件上传时的本地源文件名
    long fileLength;                                                                            //文件大小

    void createConnection(QString wurl, QString transferToken);                                 //创建连接
    void connectToServer();
    void resetTransferToken(QString transferToken);                                             //重新设置传输token，将该连接与另外一个传输批次绑定
    void downloadFile(QString fileToken, QString localFullName, long fileLength);               //下载文件
    void uploadFile(QString fileToken, QString localFullName);                                  //上传文件
    bool isBusy();                                                                              //当前是否空闲
    static QList<QFileInfo> recursionFiles(QFileInfo parent, bool fileOnly);                    //递归获取文件和文件夹

signals:
    void onTransferComplete(FiletransferHelper* helper, bool isSuccess);                         //文件传输完成信号
    void onTraning(FiletransferHelper* helper, int progress);                                    //传输中，参数是当前进度

private:
    QWebSocket* m_wsocket = nullptr;
    QString m_wurl;
    bool m_isConnected = false;
    bool m_isReady = false;                                                                     //是否已经和服务器握手完成：0x10
    bool m_isDownload = false;                                                                  //是否为下载，若否，则为上传
    bool m_isbusy = false;                                                                      //当前是否空闲，只有当一个文件传输完成后才是空闲状态
    int m_progress = 0;                                                                         //当前进度
    const int m_block = 8000;
    QFile m_file;

private:
    void startDownload();
    void startUpload();
    void throwError();

private slots:
    void slotConnected();
    void slotDisconnected();
    void slotBinaryDataReceived(QByteArray);
    void slotError(QAbstractSocket::SocketError);
};

#endif // FILETRANSFERHELPER_H
